package main

import (
	"errors"
	"fmt"
)

// 基本定义
func add(a int, b int) int {
	return a + b
}

// 多返回值
func swap(x, y string) (string, string) {
	return y, x
}

// 命名返回值
func divide(a, b float64) (result float64, err error) {
	if b == 0 {
		err = errors.New("division by zero")
		return
	}
}

// 值传递与 指针传递
func modifyValue(x int) {
	x = 100
}

func modifyPointer(x *int) {
	*x = 100
}

// 可变参数
func sum(nums ...int) int {
	total := 0
	for _, num := range nums {
		total += num
	}
	return total
}

// 函数类型
// 定于函数类型
type operation func(int, int) int

func apply(op operation, a, b int) int {
	return op(a, b)
}

// 匿名函数lambda 与 闭包
add := func(a, b int) int {
	return a + b
}

// 闭包
func adder() func(a, b int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	a := adder()
	fmt.Println(a(1)) // 输出 1
	fmt.Println(a(2)) // 输出 3
}

// 方法
type Rectangle struct {
	width, height float64
}

func (r Rectangle) area() float64 {
	return r.width * r.height
}

// 指针接收者
func (r* Rectangle) scale(factor float64) {
	r.width *= factor
	r.height *= factor
}
